package org.llc;

import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * MP自动生成代码
 * @author llc
 * @date 2019/11/15 9:59
 * @since 0.0.7
 **/
@Mojo(name = "mp-generate-plugin")
public class MpGenerateMojo extends AbstractMojo {

    /**
     * 消息
     */
    @Parameter(property = "message")
    private String message;

    /**
     * 项目路径
     */
    @Parameter(property = "dir")
    private String dir;

    /**
     * 作者
     */
    @Parameter(property = "author")
    private String author;

    /**
     * 数据库链接路径
     */
    @Parameter(property = "url")
    private String url;

    /**
     * 用户名
     */
    @Parameter(property = "username")
    private String username;

    /**
     * 密码
     */
    @Parameter(property = "password")
    private String password;

    /**
     * 模块
     */
    @Parameter(property = "module")
    private String module;

    /**
     * 包名
     */
    @Parameter(property = "packageq")
    private String packageq;

    /**
     * 表名
     */
    @Parameter(property = "tableNames")
    private String[] tableNames;

    /**
     * 包名
     */
    @Parameter(property = "daoDir",defaultValue = "dao")
    private String daoDir;

    /**
     * 插件执行
     * dsc.setSchemaName("public");
     * 实体类父类：<code>strategy.setSuperEntityClass("com.baomidou.mybatisplus.samples.generator.common.BaseEntity");</code>
     * 控制器父类：<code>strategy.setSuperControllerClass("com.baomidou.mybatisplus.samples.generator.common.BaseController");</code>
     * 实体类父类如果有 id 属性：<code>strategy.setSuperEntityColumns("id"); </code>
     * @author llc
     * @date 2019/11/15 9:59
     */
    @Override
    public void execute()throws MojoExecutionException {
        getLog().info("验证信息: "+message);
        getLog().info("项目物理路径: "+dir);
        getLog().info("作者: "+author);
        getLog().info("数据库路径: "+url);
        getLog().info("数据库用户名: "+username);
        getLog().info("数据库密码: "+password);
        getLog().info("上级包名: "+module);
        getLog().info("外包名: "+packageq);
        getLog().info("表名: "+ Arrays.toString(tableNames));
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(dir+"/src/main/java");
        gc.setAuthor(author);
        gc.setOpen(false);
        // ONLY_DATE(Date)  TIME_PACK (LocalDateTime)
        gc.setDateType(DateType.TIME_PACK);
        gc.setFileOverride(true);
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(url);
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername(username);
        dsc.setPassword(password);
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(module);
        pc.setMapper(daoDir);
        pc.setParent(packageq);
        mpg.setPackageInfo(pc);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义xml输入文件名称以及位置
                return dir+"/src/main/resources/mapper" + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        mpg.setTemplate(new TemplateConfig().setXml(null));

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        strategy.setInclude(tableNames);
        // ControllerMapping的路径 下划线/ 驼峰
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
        // 选择 freemarker 引擎需要指定如下加，注意 pom 依赖必须有！
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();

    }

}


